/******************************************************************************
文件名:ds18b20.c
描述:ds18b20温度传感器的功能实现
作者:水上清风
QQ:271657027
*******************************************************************************/

/******************************************************************************
ds18b20操作说明
ds18b20特性：-55°C——+125°C，精度0.5°C，9-12位分辨率，单总线，最大获取时长750ms，
    可设置报警温度，使用寄生电源（只接DQ）时VDD接地，
引脚定义：
GND －地
DQ －数据 I/O
VDD －可选电源电压
NC －无连接

*******************************************************************************/
#include <ds18b20.h>
static float temp = 0； //保存温度

/******************************************************************************
函数名：getTmep
描述： 从ds18b20获取温度
参数说明：
返回值：当前的温度值
*******************************************************************************/
float getTemp()
{
    return temp;
}

/******************************************************************************
函数名：initDs18b20
描述： 初始化initDs18b20
参数说明：
返回值：Nono
*******************************************************************************/
void initDs18b20()
{
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成
}


/******************************************************************************
函数名:
描述:延时n微秒(STC12C5A60S2@12M)，不同的工作环境,需要调整此函数，
    此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
参数说明:None
返回值:None
*******************************************************************************/
void delayXus(BYTE n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}


/******************************************************************************
函数名:ds18b20Reset
描述:复位DS18B20,并检测设备是否存在
参数说明:
返回值:
*******************************************************************************/
void ds18b20Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}

/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        DelayXus(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        DelayXus(1);                //恢复延时
    }
}

